/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package proycomplejidadopt;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.StringTokenizer;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author andres
 */
public class Controlador {
    
    private Solucionador solucionador;
    private String nombreArchivo;
    //Linea para leer el archivo
    private BufferedReader bf;
    private GraphViz graf;
    

    public Controlador() {
        solucionador= new Solucionador();
        
    }
    public boolean cargarDatos()
    {
        try {
            bf=new BufferedReader(new FileReader(new File(nombreArchivo)));
            StringTokenizer st;
            String linea;
            linea=bf.readLine(); //se lee el numero de bodegas
            solucionador.setNumBodegas(Integer.parseInt(linea));
            linea=bf.readLine(); //se lee el numero de PS
            solucionador.setNumPtsSum(Integer.parseInt(linea));
            linea=bf.readLine(); //se lee el numero de PD
            solucionador.setNumPtsDem(Integer.parseInt(linea));
            
            solucionador.inicializar();
           
            //se lee la produccion de cada PS
            for (int i = 0; i < solucionador.getNumPtsSum(); i++) 
            {
                linea=bf.readLine();
                solucionador.setUnidadesProdPS(i, Integer.parseInt(linea));
            }
            
            //se lee lo que requiere cada PD
            for (int i = 0; i < solucionador.getNumPtsDem(); i++) 
            {
                linea=bf.readLine();
                solucionador.setUnidadesReqPD(i, Integer.parseInt(linea));
            }
            
             //Se lee la capacidad y costo de cada bodega.
            for (int i = 0; i < solucionador.getNumBodegas(); i++) 
            {
                linea=bf.readLine();
                st=new StringTokenizer(linea);
                linea=st.nextToken();
                if(linea.equals("IL"))
                {
                    solucionador.setCapacidadBodegas(i, 100000000);
                }
                else
                    solucionador.setCapacidadBodegas(i, Integer.parseInt(linea));
                
                linea=st.nextToken();
                st=new StringTokenizer(linea, "-");
                solucionador.setCostoBodegas(i, Integer.parseInt(st.nextToken())/Integer.parseInt(st.nextToken()));
            }
            
            //se lee el costo de transporte de cada PS a la bodega.
            for (int j = 0; j < solucionador.getNumBodegas(); j++) 
            {
                linea=bf.readLine();
                st=new StringTokenizer(linea);
                
                for (int i = 0; i < solucionador.getNumPtsSum(); i++) 
                {
                    solucionador.setCostoPSBod(i, j, Integer.parseInt(st.nextToken()));
                }
            }
            
              //se lee el costo de transporte de cada PS a cada PD.
            for (int j = 0; j < solucionador.getNumPtsDem(); j++) 
            {
                linea=bf.readLine();
                st=new StringTokenizer(linea);
                
                for (int i = 0; i < solucionador.getNumPtsSum(); i++) 
                {
                    solucionador.setCostoPSPD(i, j, Integer.parseInt(st.nextToken()));
                }
            }
            
            //se lee el costo de transporte de cada Bod a cada PD.
            for (int j = 0; j < solucionador.getNumPtsDem(); j++) 
            {
                linea=bf.readLine();
                st=new StringTokenizer(linea);
                
                for (int i = 0; i < solucionador.getNumBodegas(); i++) 
                {
                    solucionador.setCostoBodPD(i, j, Integer.parseInt(st.nextToken()));
                }
            }
                        
        } catch (FileNotFoundException ex) {
            Logger.getLogger(Controlador.class.getName()).log(Level.SEVERE, null, ex);
            return false;
        }catch (Exception e)
        {
            System.out.println("Error al leer la linea del archivo "+nombreArchivo);
            return false;
        }
        
        solucionador.crearModelo();
        
        return true;
    }
    
    public int obtenerSolucion()
    {
        return solucionador.resolver();
    }
    
    public String generarGrafo(int idxNombreSalida)
    {
        int numPD, numPS, bodega;
        double auxBod;
        int [][] costosPDPS, costosPSBod, costosBodPD;
	double [] solucion;
	String nodosPS, nodosPD,salida;
        numPD=solucionador.getNumPtsDem();
        numPS=solucionador.getNumPtsSum();
        //solucion=new double [solucionador.getNumVarsModelo()];
	//costosPDPS=new int[numPD][numPS];
        costosPDPS=solucionador.getCostosPSPD();
        costosPSBod=solucionador.getCostosPSBod();
        costosBodPD=solucionador.getCostosBodPD();
        solucion=solucionador.obtenerVariablesSol();
        graf=new GraphViz();
        graf.addln(graf.start_graph());

	//Declaracion de los nodos PS
	nodosPS="node [shape=ellipse,color=\"#1f78b4\"]; ";

	for (int i=0; i<numPS; i++)
	{
		nodosPS+="PS"+(i+1)+ "_"+solucionador.getUnidadesProdPS()[i]+"; ";
	}
	
	graf.addln(nodosPS);
	//Declaracion de los nodos PD

	nodosPD="node [shape=box,color=\"#33a02c\"]; ";

	for(int i=0; i<numPD; i++)
	{	
		nodosPD+="PD"+(i+1)+"_"+solucionador.getUnidadesReqPD()[i]+"; ";
	}

	graf.addln(nodosPD);
	//Declaracion bodega
       
        bodega=0;
        auxBod=0.0;
        while(auxBod!=1.0)
        {
            auxBod=solucion[bodega];
            bodega++;
        }
        
        graf.addln("node [shape=hexagon,color=\"#e31a1c\"]; Bod"+bodega+"_C"+solucionador.getCapacidadBodegas()[bodega-1]+"_V"+solucionador.getCostoBodegas()[bodega-1]);
	
        //costos de transporte PS a PD
        for(int i=0; i<numPD; i++)
        {
            for(int j=0;j<numPS; j++)
            {
                graf.addln("PS"+(i+1)+"_"+solucionador.getUnidadesProdPS()[i]+" -> "+"PD"+(j+1)+"_"+solucionador.getUnidadesReqPD()[j]+" [ label = \""+costosPDPS[i][j]+"("+(int)solucion[solucionador.getColModeloPSPD()[i][j]-1]+")"+"\",arrowhead=vee,style=tapered];");
            }
        }

	//costos de transporte PS a bodega elegida

	for (int i=0; i<numPS; i++)
        {
            graf.addln("PS"+(i+1)+"_"+solucionador.getUnidadesProdPS()[i]+" -> "+"Bod"+bodega+"_C"+solucionador.getCapacidadBodegas()[bodega-1]+"_V"+solucionador.getCostoBodegas()[bodega-1]+" [ label = \""+costosPSBod[i][bodega-1]+"("+(int)solucion[solucionador.getColModeloPSBod()[i][bodega-1]-1]+")"+"\",arrowhead=vee];");
        }

	//costos de transporte de bodega elegida a PD
        
        for (int i=0; i<numPD; i++)
        {
            graf.addln("Bod"+bodega+"_C"+solucionador.getCapacidadBodegas()[bodega-1]+"_V"+solucionador.getCostoBodegas()[bodega-1]+" -> "+"PD"+(i+1)+"_"+solucionador.getUnidadesReqPD()[i]+" [ label = \""+costosBodPD[bodega-1][i]+"("+(int)solucion[solucionador.getColModeloBodPD()[bodega-1][i]-1]+")"+"\",arrowhead=vee]");
        }
        
        graf.addln(graf.end_graph());
        System.out.println(graf.getDotSource());
 
        String type = "gif";
        File out = new File("out"+idxNombreSalida+"." + type);   // out.gif in this example
        graf.writeGraphToFile( graf.getGraph( graf.getDotSource(), type ), out );
        salida=out.getAbsolutePath();
	return salida;
    }
    
    
    public String getNombreArchivo() {
        return nombreArchivo;
    }

    public void setNombreArchivo(String nombreArchivo) {
        this.nombreArchivo = nombreArchivo;
    }

    public Solucionador getSolucionador() {
        return solucionador;
    }

    public void setSolucionador(Solucionador solucionador) {
        this.solucionador = solucionador;
    }
    
    
    
}
